#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

sem_t sem;

void* thread_func(void* arg)
{
    printf("Start to wait .. #%ld\n", (long)arg);
    sem_wait(&sem); // 等待信号量
    printf("Entered.. %ld\n", (long)arg);

    // critical section
    sleep(4);

    printf("Exiting.. %ld\n", (long)arg);
    sem_post(&sem); // 释放信号量
    return NULL;
}

/*
当信号量的值大于0时，sem_wait会减少信号量的值并立即返回。
当信号量的值为0时，sem_wait会阻塞，直到信号量的值大于0。
sem_post会增加信号量的值，如果有线程在等待这个信号量，那么其中一个线程会被唤醒
*/

int main()
{
    pthread_t t1, t2;
    sem_init(&sem, 0, 1); // 初始化信号量，最初的值为1

    pthread_create(&t1, NULL, thread_func, (void*)1);
    sleep(2);
    pthread_create(&t2, NULL, thread_func, (void*)2);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    sem_destroy(&sem); // 销毁信号量
    return 0;
}
